package com.bbva.gptf.front.web;

import java.math.BigDecimal;
import java.util.Calendar;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.bbva.gptf.dto.bean.Actividad;
import com.bbva.gptf.dto.bean.BitacoraActividad;
import com.bbva.gptf.dto.bean.LoginForm;
import com.bbva.gptf.dto.bean.Usuario;
import com.bbva.gptf.dto.servicio.usuario.ServicioLoginFacade;
import com.bbva.jee.arq.spring.core.constantes.ConstantesContexto;
import com.bbva.jee.arq.spring.core.constantes.ConstantesLog;
import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.contexto.Contexto;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.jee.arq.spring.core.seguridad.ArqSpringAuthoritiesProvider;
import com.bbva.jee.arq.spring.core.seguridad.custodio.ArqSpringRequestHeader;

@RequestMapping("/controladorlogin/**")
@Controller
public class ControladorLogin {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static final BigDecimal INICIOSESION = BigDecimal.ONE;
	private static final BigDecimal FINSESION = new BigDecimal(2);

	private static final I18nLog LOG = I18nLogFactory.getLogI18n(
			ControladorLogin.class, ConstantesLog.MENSAJES_GENERAL);

	@Resource(name = "servicioLoginFacadeHttpHTTPClient")
	private ServicioLoginFacade servicioLoginFacade;

	private BitacoraActividad creaBitacora(final Usuario usuario,
			final String ipUsuario, final BigDecimal cdActividad) {
		final BitacoraActividad actividad = new BitacoraActividad();
		final Calendar cal = Calendar.getInstance();
		actividad.setUsuario(usuario);
		actividad.setActividad(new Actividad(cdActividad));
		actividad.setIpUsuario(ipUsuario);
		actividad.setFhActividad(cal.getTime());
		return actividad;
	}

	@RequestMapping
	public void get(final ModelMap modelMap, final HttpServletRequest request,
			final HttpServletResponse response) {
	}

	@RequestMapping
	public String index(final Model iuModel) {
		return "index";
	}

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView login(@Valid final LoginForm loginForm,
			final BindingResult bindingResult, final Model uiModel,
			final HttpServletRequest request,
			final HttpServletResponse response, final Contexto contexto) {
		final ArqSpringRequestHeader alterRequest = new ArqSpringRequestHeader(
				request);
		String viewName = "login";
		if (validaForm(loginForm)) {
			uiModel.asMap().clear();
			final Usuario usuario = servicioLoginFacade
					.comprobarUsuario(loginForm);

			if (usuario != null
					&& usuario.getStUsuario().compareTo(BigDecimal.ONE) == 0) {
				viewName = "index";
				request.getSession().setAttribute("usuario", usuario);
				request.getSession().setAttribute("ipUsuario",
						request.getRemoteAddr());
				request.getSession().setAttribute("iv-user",
						usuario.getCdBancomer());
				final BitacoraActividad bitacoraActividad = creaBitacora(
						usuario, request.getRemoteAddr(), INICIOSESION);
				servicioLoginFacade.insertaBitacoraActividad(bitacoraActividad);
				response.setHeader("iv-user", usuario.getCdBancomer());

				alterRequest.putParametroHeader("iv-user",
						usuario.getCdBancomer());
			} else if (usuario != null
					&& usuario.getStUsuario().compareTo(BigDecimal.ZERO) == 0) {
				loginForm.setMsjError("El usuario se encuentra inactivo");
			} else {
				loginForm.setMsjError("El usuario es incorrecto");
			}
		}
		return new ModelAndView(viewName, "loginForm", loginForm);
	}

	@RequestMapping(method = RequestMethod.POST, value = "{id}")
	public void post(@PathVariable final Long id, final ModelMap modelMap,
			final HttpServletRequest request, final HttpServletResponse response) {
	}

	@RequestMapping(value = "/salir", method = RequestMethod.GET)
	public String salir(final HttpServletRequest request,final HttpServletResponse response) {
		try {
			final String logoutWebseal = ArqSpringContext
					.getPropiedad("URL.WEBSEAL.LOGOUT");
			final Usuario usuario = (Usuario) request.getSession()
					.getAttribute("usuario");
			final BitacoraActividad bitacoraActividad = creaBitacora(usuario,
					request.getRemoteAddr(), FINSESION);
			servicioLoginFacade.insertaBitacoraActividad(bitacoraActividad);
			ArqSpringContext.setSesionUsuario(ConstantesContexto.INICIALIZADO,
					null);
			ArqSpringAuthoritiesProvider.setUsuario("");
			ArqSpringContext.setContextoEscritorio(null);
			ArqSpringContext.eliminarSesion();
			SecurityContextHolder.createEmptyContext();
			SecurityContextHolder.clearContext();
			request.getSession().invalidate();
			response.sendRedirect(logoutWebseal);	
		} catch (Exception ex) {
			LOG.error("Error cerrando sesion", ex);
		}
		return "login";
	}

	private Boolean validaForm(final LoginForm loginForm) {
		String msjError = null;
		Boolean valido = Boolean.TRUE;

		// if (StringUtils.isBlank(loginForm.getCdUsuario())
		// && StringUtils.isBlank(loginForm.getClave())) {
		// valido = Boolean.FALSE;
		// msjError = "Debe escribir su nombre de usuario y clave de acceso";
		// } else

		if (StringUtils.isBlank(loginForm.getCdUsuario())) {
			valido = Boolean.FALSE;
			msjError = "Debe escribir su nombre de usuario";
		}

		// else if (StringUtils.isBlank(loginForm.getClave())) {
		// valido = Boolean.FALSE;
		// msjError = "Debe escribir su clave de acceso";
		// }

		loginForm.setMsjError(msjError);
		return valido;
	}

	@RequestMapping(value = "/valsesion", method = RequestMethod.GET)
	public @ResponseBody
	Boolean valsesion(final HttpServletRequest request) {

		if (request.getSession().getAttribute("usuario") != null) {
			return true;
		}

		return false;
	}
}
